package com.dimples.dd.system.mapper;

import com.dimples.dd.common.pojo.PageResult;
import com.dimples.dd.mybatis.core.query.LambdaQueryWrapperX;
import com.dimples.dd.mybatis.core.query.MPJLambdaWrapperX;
import com.dimples.dd.system.model.entity.SystemDictDataDO;
import com.dimples.dd.system.model.entity.SystemDictTypeDO;
import com.dimples.dd.system.model.query.DictPageQuery;
import org.apache.ibatis.annotations.Mapper;

import java.util.List;

@Mapper
public interface SystemDictDataMapper extends com.dimples.dd.mybatis.core.mapper.BaseMapperX<SystemDictDataDO> {

    /**
     * 根据字典类型编码查询存在字典数据的字典类型Id
     *
     * @param typeCodeList 字典类型编码集合
     * @return 存在字典数据的字典类型Id
     */
    default List<String> selectDictTypeByTypeCode(List<String> typeCodeList) {
        MPJLambdaWrapperX<SystemDictDataDO> wrapper = new MPJLambdaWrapperX<>();
        wrapper.first("SELECT B.type FROM (SELECT A.type, COUNT(1) AS count FROM (")
                .select(SystemDictTypeDO::getType)
                .leftJoin(SystemDictTypeDO.class, SystemDictTypeDO::getType, SystemDictDataDO::getDictType)
                .in(SystemDictDataDO::getDictType, typeCodeList)
                .groupBy(SystemDictDataDO::getDictType)
                .last(") A GROUP BY A.type) B WHERE B.count > 0")
        ;
        return this.selectJoinList(String.class, wrapper);
    }

    /**
     * 分页查询字典数据
     *
     * @param queryParams 查询参数
     * @return 分页数据
     */
    default PageResult<SystemDictDataDO> selectPage(DictPageQuery queryParams) {
        return this.selectPage(queryParams
                , new LambdaQueryWrapperX<SystemDictDataDO>()
                        .likeIfPresent(SystemDictDataDO::getLabel, queryParams.getLabel())
                        .eqIfPresent(SystemDictDataDO::getDictType, queryParams.getDictType())
                        .eqIfPresent(SystemDictDataDO::getStatus, queryParams.getStatus())
                        .orderByAsc(SystemDictDataDO::getDictType, SystemDictDataDO::getSort));
    }

    /**
     * 根据字典类型编码和字典值查询字典数据
     *
     * @param dictType 字典类型编码
     * @param value    字典值
     * @return 字典数据
     */
    default SystemDictDataDO selectByDictTypeAndValue(String dictType, String value) {
        return selectOne(SystemDictDataDO::getDictType, dictType, SystemDictDataDO::getValue, value);
    }

    /**
     * 根据字典类型编码和状态查询字典数据
     *
     * @param status   状态
     * @param dictType 字典类型编码
     * @return 字典数据
     */
    default List<SystemDictDataDO> selectListByStatusAndDictType(Integer status, String dictType) {
        return selectList(new LambdaQueryWrapperX<SystemDictDataDO>()
                .eqIfPresent(SystemDictDataDO::getStatus, status)
                .eqIfPresent(SystemDictDataDO::getDictType, dictType));
    }
}
















